<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: transport/struc/shm/capnp_msg_builder.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;1.0.2</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_330ec51ed7bfaf381355aaef7c1667ec.html">transport</a></li><li class="navelem"><a class="el" href="dir_6bf669985e0a4bfed5b74de88b3e7893.html">struc</a></li><li class="navelem"><a class="el" href="dir_ad52dd8cdf71953d2954f95ecd6c0394.html">shm</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">capnp_msg_builder.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="capnp__msg__builder_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Shared Memory</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="struc__fwd_8hpp.html">ipc/transport/struc/struc_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="session_2shm_2shm_8hpp.html">ipc/session/shm/shm.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="arena__activator_8hpp.html">ipc/shm/stl/arena_activator.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &quot;<a class="code" href="stateless__allocator_8hpp.html">ipc/shm/stl/stateless_allocator.hpp</a>&quot;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &quot;<a class="code" href="shm_2shm_8hpp.html">ipc/shm/shm.hpp</a>&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="preprocessor">#include &quot;ipc/transport/struc/shm/schema/detail/serialization.capnp.h&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="preprocessor">#include &lt;boost/interprocess/containers/list.hpp&gt;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="namespaceipc_1_1transport_1_1struc_1_1shm.html">   29</a></span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1transport_1_1struc_1_1shm.html">ipc::transport::struc::shm</a></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>{</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment"></span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment">/**</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"> * A `capnp::MessageBuilder` used by shm::Builder: similar to a `MallocMessageBuilder`</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment"> * with the `GROW_HEURISTICALLY` alloc-strategy but allocating via a SHM provider (of template-arg-specific</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * type) in SHM instead of the heap via `malloc()`.</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> *</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> * It can also be used as a #Capnp_msg_builder_interface (`capnp::MessageBuilder`) independently of the rest of</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> * ipc::transport::struc or even ::ipc, although that was not the impetus for its development.</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> *</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> * Its #Segments_in_shm type alias is `public`: shm::Reader must know/understand it in order to be able to</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * interpret the SHM-stored data structure.</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> *</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * Contrast this with Heap_fixed_builder_capnp_message_builder which allocates in regular heap.</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> * The `*this`-user-facing output API -- meaning the thing invoked by struc::Builder::emit_serialization() --</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> * is lend().  Cf. Heap_fixed_builder_capnp_message_builder::emit_segment_blobs().</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * Why are they so different?  Answer:</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> *   - The latter is meant to emit M segments, each (some) bytes long, to all be transmitted directly over IPC.</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> *     So it outputs them, to copy into the IPC transport!</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> *   - We are meant to emit a *handle to a data structure storing those M segments* to be transmitted directly over</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> *     IPC.  The handle is transmitted; not the entire segments.  So it outputs that handle!  It just so happens</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> *     to output it via a capnp mutator call.  (It could instead emit a `flow::util::Blob` and let the caller</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> *     transmit it however it wants.  Why bother though?  Just do it.  However do see a related to-do in</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> *     lend() doc header.)</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> *</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> * ### Move-ctible and move-assignable ###</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> * Please see similar section in Heap_fixed_builder_capnp_message_builder doc header; it applies</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> * very similarly to us.  Spoiler alert: A move-from involves copying 200+ bytes; consider wrapping `*this`</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> * in a `unique_ptr` if moving `*this`.</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> *</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> * @tparam Shm_arena</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> *         See shm::Builder doc header, same spot.</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> */</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html">   66</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html">Capnp_message_builder</a> :</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>  <span class="keyword">public</span> <a class="code hl_class" href="classCapnp__msg__builder__interface.html">Capnp_msg_builder_interface</a>,</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>  <span class="keyword">public</span> flow::log::Log_context</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>{</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"></span> </div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment">  /// Short-hand for, you know.</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">   74</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">Arena</a> = Shm_arena;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"></span> </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment">  /// Short-hand for the SHM-aware allocator used in our central data structure holding the capnp serialization.</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac24a769b13a6c501709a5eb1a574a503">   78</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Stateless__allocator.html">Allocator</a> = <a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Stateless__allocator.html">ipc::shm::stl::Stateless_allocator&lt;T, Arena&gt;</a>;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"></span> </div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment">   * For easier outside generic programming, this is the read-only-borrower counterpart to</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment">   * #Allocator.  See also #Segments_in_shm_borrowed.</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment">   */</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a151f03b066fd5fe0c4dfbf97e5fd57dc">   85</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Stateless__allocator.html">Borrower_allocator</a></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>    = <a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Stateless__allocator.html">ipc::shm::stl::Stateless_allocator&lt;T, ipc::shm::Arena_to_borrower_allocator_arena_t&lt;Arena&gt;</a>&gt;;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment"></span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">   * The inner data structure stored in SHM representing one capnp-requested segment storing all or part of</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment">   * the serialization.  `.capacity()` is how much was allocated which is at least what capnp-requested via</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment">   * allocateSegment() `virtual` API we implement.  `.size()` is how many bytes of that were in fact ultimately</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment">   * used by capnp during the *last* serialization as capped by lend().  If `*this` is</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment">   * reused, then capnp may write past `.size()` (but not past `.capacity()`); lend()</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment">   * will then re-correct `.size()` to the true segment size used by capnp as reported by</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment">   * `this-&gt;getSegmentsForOutput()`.</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment">   *</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment">   * ### Choice of container type ###</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment">   * In the past this was, first, `std::vector&lt;uint8_t&gt;` (which needed `Default_init_allocator` to avoid</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment">   * 0-filling during `.resize()` -- see lend()); then `bipc::vector&lt;uint8_t&gt;` (which needed</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment">   * `.resize(n, default_init_t)` extension for the same reason ).  Then, as intended originally, it became</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment">   * `flow::util::Basic_blob&lt;&gt;`.  Why that over `vector&lt;uint8_t&gt;`?  Answer: `Basic_blob`&#39;s express purpose</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment">   * is to do just this; some of its main documented aspects (lack of zero-init, iron-clad known perf) are</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment">   * directly counted-upon by us.  So we use it for similar reasons as using `flow::util::Blob` all over the</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment">   * code for such purposes -- maybe even more so.</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment">   *</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment">   * So really the only thing missing, before we could use it, was its SHM-friendly/custom-allocator support.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment">   * `Blob` cannot do it.  Once the latter was generalized to `Basic_blob&lt;Allocator&gt;` we could switch to it,</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment">   * leaving behind a number of rather annoying caveats of the various `vector&lt;uint8_t&gt;` impls</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment">   * (0-init especially on `.resize()`, slow destructor on large blobs, and more).</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment">   *</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment">   * For reasons stated in its doc header `Basic_blob` does not log in normal fashion (memorizing a `Logger*`</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment">   * via ctor) but only if supplied an optional `Logger*` in each particular call.  (`Blob` is a sub-class</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment">   * that adds such functionality at the expense of a bit of RAM/perf, but this is impossible with a custom SHM</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment">   * allocator.)  So that&#39;s why `get_logger()` is passed to the few APIs we call on our `Basic_blob`.</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment">   */</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a78c9e811a0cc8105fee37baf5f94929c">  116</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a78c9e811a0cc8105fee37baf5f94929c">Segment_in_shm</a> = flow::util::Basic_blob&lt;Allocator&lt;uint8_t&gt;&gt;;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment"></span> </div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment">   * For easier outside generic programming, this is the read-only-borrower counterpart to</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment">   * #Segment_in_shm.  See also #Segments_in_shm_borrowed.</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment">   */</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3c7909056d89e83d76ca4555193d3e48">  122</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3c7909056d89e83d76ca4555193d3e48">Segment_in_shm_borrowed</a> = flow::util::Basic_blob&lt;Borrower_allocator&lt;uint8_t&gt;&gt;;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment"></span> </div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment">   * The outer data structured stored in SHM representing the entire list of capnp-requested segments #Segment_in_shm.</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment">   *</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment">   * ### Rationale (`bipc::` vs `std::`) ###</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment">   * Why `bipc::list` and not `std::list`?  Answer:</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment">   * `std::list`, at least in gcc-8.3.0, gave a compile error fairly clearly implying `std::list` stores</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment">   * `Node*` instead of `Allocator&lt;Node&gt;::pointer`; in other words it is not compatible with SHM</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment">   * (which bipc docs did claim -- but that could easily have been outdated).</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment">   *</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment">   * Curiously `std::vector` did not have that problem and worked fine, as far as that went, but we prefer</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment">   * a linked-list here.</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment">   */</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac2e22abe941240ffa765bff7d288ce1e">  136</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac2e22abe941240ffa765bff7d288ce1e">Segments_in_shm</a> = bipc::list&lt;Segment_in_shm, Allocator&lt;Segment_in_shm&gt;&gt;;</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"></span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment">   * For easier outside generic programming, this is the read-only-borrower counterpart to</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment">   * #Segments_in_shm: identical but using #Borrower_allocator instead of #Allocator.</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment">   * This type shall be used with `borrow_object()` on the deserializing side when decoding</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment">   * the #Segments_in_shm written by a `*this`.</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment">   */</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a7c04e91665590eb6b80d3ae1931765e8">  144</a></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a7c04e91665590eb6b80d3ae1931765e8">Segments_in_shm_borrowed</a> = bipc::list&lt;Segment_in_shm_borrowed, Borrower_allocator&lt;Segment_in_shm_borrowed&gt;&gt;;</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span> </div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment"></span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment">   * Constructs the message-builder, memorizing the SHM engine it shall use to construct/allocate data internally</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment">   * on-demand via allocateSegment() (capnp-invoked from capnp-generated mutator API as invoked by the user).</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment">   *</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment">   *        Logger to use for logging subsequently.</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment">   * @param arena</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment">   *        See shm::Builder ctor.</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment">   */</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a0c3134a722b160fe2cf87461064db99b">Capnp_message_builder</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">Arena</a>* arena);</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment"></span> </div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment">  /// Decrements owner-process count by 1; if current count is 1 deallocates SHM-stored data.</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3a21d479a863dd80df331b902c7fef16">~Capnp_message_builder</a>();</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment"></span> </div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment">   * To be called after being done mutating underlying structured data, increments owner-process count</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment">   * by 1 via `shm_session-&gt;lend_object()`; and populates a capnp-`struct` field, saving the encoding of the</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment">   * outer SHM handle to the serialization-segment data structure #Segments_in_shm into that field.</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment">   *</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment">   * You may call this method more than once per `*this`.  In particular this is necessary if sending the SHM-handle</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment">   * via IPC more than once -- even if one has already sent it to that same process (or another).</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment">   * Even if the bits populated into `*capnp_root` shall always be the same for a given `*this`, it is</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment">   * nevertheless required to call it repeatedly when sharing repeatedly.</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment">   *</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment">   * @todo Would be nice to provide a more-general counterpart to existing</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment">   * Capnp_message_builder::lend() (in addition to that one which outputs into a capnp structure),</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment">   * such as one that outputs a mere `Blob`.  The existing one is suitable for the main use-case which is internally by</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment">   * shm::Builder; but Capnp_message_builder is also usable as a `capnp::MessageBuilder` directly.  If a user were to</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment">   * indeed leverage it in that latter capacity, they may want to transmit/store the SHM-handle some other way.</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment">   * Note that as of this writing the direct-use-by-general-user-as-`MessageBuilder` use-case is supported &quot;just</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment">   * because&quot; it can be; nothing in particular needed it.</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment">   *</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment">   * @param capnp_root</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment">   *        The target SHM-handle serialization root to populate as noted above.</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment">   * @param shm_session</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment">   *        `Shm_session` to the opposing recipient to which we are lending.</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   */</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>  <span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a4a613441302d5735d686adb7d6d92fb0">lend</a>(<a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">schema::detail::ShmTopSerialization::Builder</a>* capnp_root,</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>            <a class="code hl_typedef" href="namespaceipc_1_1session_1_1shm.html#af2acc444cc9664e57df8143b66b78d70">session::shm::Arena_to_shm_session_t&lt;Arena&gt;</a>* shm_session);</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span><span class="comment"></span> </div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment">   * Implements `MessageBuilder` API.  Invoked by capnp, as the user mutates via `Builder`s.  Do not invoke directly.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment">   *</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment">   * Throws a `bad_alloc`-like exception if and only if the #Arena does so when allocating on behalf of the</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">   * STL-compliant inner code of #Segments_in_shm.</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   *</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   * @note The strange capitalization (that goes against standard Flow-IPC style) is because we are implementing</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment">   *       a capnp API.</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment">   *</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment">   * @param min_sz</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="comment">   *        See `MessageBuilder` API.</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment">   *        The allocated segment will allow for a serialization of at *least* `min_sz * sizeof(word)` bytes.</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment">   *        The actual amount grows progressively similarly to the `MallocMessageBuilder` GROW_HEURISTICALLY</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment">   *        strategy, starting at the same recommended first-segment size as `MallocMessageBuilder` as well.</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment">   * @return See `MessageBuilder` API.</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment">   *         The ptr and size of the area for capnp to serialize-to.</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment">   */</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>  kj::ArrayPtr&lt;::capnp::word&gt; <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a27d819a8373d2706f8c09341601a9cab">allocateSegment</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> min_sz) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment"></span> </div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment">  /// Short-hand for the SHM-arena activator coupled with #Allocator.</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a5560c7f7c7bf29103f6a96a6feff9c90">  213</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Arena__activator.html">Arena_activator</a> = <a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Arena__activator.html">ipc::shm::stl::Arena_activator&lt;Arena&gt;</a>;</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="comment"></span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment">  /// See ctor.</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a49b5e0642b5c1be67c79e55484ecb7b6">  218</a></span><span class="comment"></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">Arena</a>* <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a49b5e0642b5c1be67c79e55484ecb7b6">m_arena</a>;</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment"></span> </div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment">   * Minimum size of the next segment allocated by allocateSegment.  Roughly speaking the actual size will be</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment">   * the higher of `min_sz` or this.  Its initial value (seg 1&#39;s) is a constant.  Its subsequent value is</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment">   * the sum of sizes of the previous segments; meaning itself plus whatever allocateSegment() decided to allocate.</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment">   * This results in exponential growth... ish.</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment">   *</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment">   * This follows `MallocMessageBuilder` GROW_HEURISTICALLY logic, straight-up lifted from their source code.</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment">   */</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a89d5dac6078a1a2c184e2239810b5480">  228</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a89d5dac6078a1a2c184e2239810b5480">m_segment_sz</a>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment"></span> </div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment">  /// Outer SHM handle to the data structured in SHM that stores the capnp-requested serialization segments.</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a98472f1e376123f6d98297f5c61ebc76">  231</a></span><span class="comment"></span>  <span class="keyword">typename</span> Arena::template Handle&lt;Segments_in_shm&gt; <a class="code hl_variable" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a98472f1e376123f6d98297f5c61ebc76">m_serialization_segments</a>;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>}; <span class="comment">// class Capnp_message_builder</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span> </div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment">// Free functions: in *_fwd.hpp.</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span> </div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="comment">// Template implementations.</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a0c3134a722b160fe2cf87461064db99b">  239</a></span><a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a0c3134a722b160fe2cf87461064db99b">Capnp_message_builder&lt;Shm_arena&gt;::Capnp_message_builder</a></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>  (flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">Arena</a>* arena) :</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span> </div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>  flow::log::Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">Log_component</a>::S_TRANSPORT),</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span>  m_arena(arena),</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span>  <span class="comment">// Borrow MallocMessageBuilder&#39;s heuristic:</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>  m_segment_sz(::<a class="code hl_namespace" href="namespacecapnp.html">capnp</a>::SUGGESTED_FIRST_SEGMENT_WORDS * sizeof(::<a class="code hl_namespace" href="namespacecapnp.html">capnp</a>::word)),</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>  <span class="comment">// Construct the data structure holding the segments, saving a small shared_ptr handle into SHM.</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span>  m_serialization_segments(m_arena-&gt;template construct&lt;<a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac2e22abe941240ffa765bff7d288ce1e">Segments_in_shm</a>&gt;()) <span class="comment">// Can throw.</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>{</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;SHM builder [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Created.&quot;</span>);</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span>}</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span> </div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3a21d479a863dd80df331b902c7fef16">  253</a></span><a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3a21d479a863dd80df331b902c7fef16">Capnp_message_builder&lt;Shm_arena&gt;::~Capnp_message_builder</a>()</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>{</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;SHM builder [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Destroyed.  The following may SHM-dealloc the serialization, &quot;</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>                 <span class="stringliteral">&quot;if recipient was done with it before us, or if we hadn&#39;t done lend() yet.&quot;</span>);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>  <span class="comment">// m_serialization_segments Handle&lt;&gt; (shared_ptr&lt;&gt;) ref-count will decrement here (possibly to 0).</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span>}</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span> </div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a4a613441302d5735d686adb7d6d92fb0">  261</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a4a613441302d5735d686adb7d6d92fb0">Capnp_message_builder&lt;Shm_arena&gt;::lend</a></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>       (<a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">schema::detail::ShmTopSerialization::Builder</a>* capnp_root,</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>        <a class="code hl_typedef" href="namespaceipc_1_1session_1_1shm.html#af2acc444cc9664e57df8143b66b78d70">session::shm::Arena_to_shm_session_t&lt;Arena&gt;</a>* shm_session)</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>{</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>  <span class="keyword">using </span>flow::util::buffers_dump_string;</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span> </div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>  assert(capnp_root);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span>  <span class="comment">/* Firstly read the paragraph about this method versus</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment">   * Heap_fixed_builder_capnp_message_builder::emit_segment_blobs() (in our class doc header).</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment">   * That sets up some mental context.  Then come back here.</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">   * Spiritually we&#39;re doing something similar here: they&#39;ve got a list-of-Blobs; we&#39;ve got the same;</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">   * we need to adjust the latters&#39; `.size()`s down from `capacity()` to actual space used in serialization.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment">   * The differences are:</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment">   *   - They&#39;re stored in SHM via Stateless_allocator; need to ensure thread-local active arena is m_arena.</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment">   *   - To emit, we just emit the outer SHM handle to the whole list-o&#39;-blobs (they emit the actual list, to be</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment">   *     copied).</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment">   *</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment">   * Well... let&#39;s go then. */</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span> </div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>  {</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>    <span class="comment">/* As noted: activate the arena, in case the below .resize() causes allocation.  (It shouldn&#39;t... we&#39;re</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment">     * resizing down.  Better safe than sorry, plus it&#39;s more maintainable.  (What if it becomes a deque&lt;&gt; later</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment">     * or something?)) */</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>    <a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Arena__activator.html">Arena_activator</a> arena_ctx(m_arena);</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span> </div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>    <span class="comment">// All of the below is much like Heap_fixed_builder_capnp_message_builder::emit_segment_blobs() except as noted.</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span> </div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>    <a class="code hl_typedef" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac2e22abe941240ffa765bff7d288ce1e">Segments_in_shm</a>&amp; blobs = *m_serialization_segments;</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>    assert((!blobs.empty())</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>           &amp;&amp; <span class="stringliteral">&quot;Should not be possible for serialization to be empty with our use cases.  Investigate.&quot;</span>);</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>    <span class="keyword">const</span> <span class="keyword">auto</span> capnp_segs = getSegmentsForOutput();</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>    assert((capnp_segs.size() == blobs.size())</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>           &amp;&amp; <span class="stringliteral">&quot;Somehow our MessageBuilder created fewer or more segments than allocateSegment() was called?!&quot;</span>);</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span> </div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>    <span class="keywordtype">size_t</span> idx;</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>    <span class="keyword">typename</span> Segments_in_shm::iterator blob_it;</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>    <span class="keywordflow">for</span> (idx = 0, blob_it = blobs.begin(); idx != capnp_segs.size(); ++idx, ++blob_it)</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>    {</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>      <span class="keyword">const</span> <span class="keyword">auto</span> capnp_seg = capnp_segs[idx].asBytes();</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>      <span class="keyword">const</span> <span class="keyword">auto</span> seg_sz = capnp_seg.size();</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span> </div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>      <span class="keyword">auto</span>&amp; blob = *blob_it;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span> </div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>      assert((capnp_seg.begin() == &amp;(blob.front()))</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>             &amp;&amp; <span class="stringliteral">&quot;Somehow capnp-returned segments are out of order to allocateSegment() calls; or something....&quot;</span>);</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>      assert((seg_sz != 0)</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>             &amp;&amp; <span class="stringliteral">&quot;capnp shouldn&#39;t be generating zero-sized segments.&quot;</span>);</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>      assert((seg_sz &lt;= blob.capacity())</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>             &amp;&amp; <span class="stringliteral">&quot;capnp somehow overflowed the area we gave it.&quot;</span>);</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span> </div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>      <span class="comment">/* This .resize() call is interesting (and was quite treacherous when Segment_in_shm was a vector&lt;uint8_t&gt;).</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span><span class="comment">       * A regular .resize(n) is uncontroversial when .size() exceeds or equals n.</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">       * It just adjusts an internal m_size thing.  Suppose `n &lt;= capacity()` (always the case for us and ensured</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span><span class="comment">       * above).  Suppose now though that `.size() &lt; n`.  It works fine in Blob: we wrote past .size() but not</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">       * past .capacity(), and the .resize() &quot;corrects&quot; m_size accordingly.  With vector&lt;uint8_t&gt;, without taking</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span><span class="comment">       * special measures (std::vector&lt;Default_init_allocator&lt;...&gt;&gt; or bipc::vector&lt;&gt;::resize(n, default_init))</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span><span class="comment">       * it would also catastrophically (for us) zero-fill the bytes between size() and n: If lend()</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span><span class="comment">       * is being called on a *this that has already been lend()ed -- the case in particular where an</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span><span class="comment">       * out-message is serialized, sent, modified (to require more space in an existing segment),</span></div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span><span class="comment">       * serialized again, sent again.  Then this .resize() would zero out the added new bytes in the serialization!</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span><span class="comment">       * Uncarefully-written user code might even .initX(n) (where x = List or Data, say) a field that</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span><span class="comment">       * was previously .initX(n)ed; capnp does not simply reuse the space but rather orphans the previous X</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span><span class="comment">       * and creates a new List/Data X in a later, new part in the same segment (if there&#39;s space left).</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span><span class="comment">       * Now the deserializing side will observe the X is all zeroes... WTF?!</span></div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span><span class="comment">       *</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span><span class="comment">       * Anyway, I mention that for posterity/education and to point out the fact we might be writing past</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span><span class="comment">       * .size() temporarily, until the present method executes; and that&#39;s somewhat unusual (but legal).</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span><span class="comment">       * Segment_in_shm=Basic_blob does not have the zeroing problem. */</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>      blob.resize(seg_sz,</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>                  flow::util::Blob::S_UNCHANGED, <span class="comment">// Can be removed if next arg is removed.</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>                  get_logger()); <span class="comment">// (TRACE-log if enabled.)  Must be removed if Segment_in_shm becomes non-Blob.</span></div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span> </div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;SHM builder [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>                     <span class="stringliteral">&quot;Serialization segment [&quot;</span> &lt;&lt; idx &lt;&lt; <span class="stringliteral">&quot;] (0 based, of [&quot;</span> &lt;&lt; capnp_segs.size() &lt;&lt; <span class="stringliteral">&quot;], 1-based): &quot;</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span>                     <span class="stringliteral">&quot;SHM-arena buffer @[&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;(blob.front())) &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>                     <span class="stringliteral">&quot;sized [&quot;</span> &lt;&lt; seg_sz &lt;&lt; <span class="stringliteral">&quot;]: Serialization of segment complete.&quot;</span>);</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>      FLOW_LOG_DATA(<span class="stringliteral">&quot;Segment contents: &quot;</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>                    <span class="stringliteral">&quot;[\n&quot;</span> &lt;&lt; buffers_dump_string(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">Blob_const</a>(&amp;(blob.front()), blob.size()), <span class="stringliteral">&quot;  &quot;</span>) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>    } <span class="comment">// for (idx in [0, size()))</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>  } <span class="comment">// Arena_activator arena_ctx(m_arena);</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span> </div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>  <span class="comment">/* And now just record the process-agnostic serialization of the handle to the whole thing.  Nice and small!</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span><span class="comment">   * The rest is inside `blobs` which is wholly in SHM and needs no encoding. */</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>  <span class="comment">// Source blob (bits encoding handle):</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>  <span class="keyword">const</span> <span class="keyword">auto</span> handle_serialization_blob = shm_session-&gt;template lend_object&lt;Segments_in_shm&gt;(m_serialization_segments);</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>  <span class="comment">// Target SHM handle (inside capnp struct).  Avoid wasting internal serialization space if already init...()ed.</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span>  <span class="keyword">auto</span> capnp_segment_list_in_shm = capnp_root-&gt;hasSegmentListInShm() ? capnp_root-&gt;getSegmentListInShm()</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>                                                                     : capnp_root-&gt;initSegmentListInShm();</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>  <span class="comment">// Copy handle-encoding bits (only a few bytes, by Session contract) from source to target:</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>  <a class="code hl_function" href="namespaceipc_1_1transport_1_1struc_1_1shm.html#ab592ce6eddbe24c57dc71f34018fb042">capnp_set_lent_shm_handle</a>(&amp;capnp_segment_list_in_shm, handle_serialization_blob);</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span> </div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>  <span class="comment">/* Process-count in m_serialization_segments incremented ahead of transmission (this is logged), probably to 2</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span><span class="comment">   * (higher if lend() called more than 1x).</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span><span class="comment">   * Now underlying SHM-stored segments won&#39;t de dealloc-ed until the other side receives it and later indicates</span></div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span><span class="comment">   * that process is done with them (if send succeeds) + *this is destroyed. */</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>} <span class="comment">// Capnp_message_builder::lend()</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span> </div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>kj::ArrayPtr&lt;::capnp::word&gt;</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a27d819a8373d2706f8c09341601a9cab">  364</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a27d819a8373d2706f8c09341601a9cab">Capnp_message_builder&lt;Shm_arena&gt;::allocateSegment</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> min_sz) <span class="comment">// Virtual.</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>{</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>  <span class="keyword">using </span>Word = ::capnp::word;</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>  <span class="keyword">using </span>Capnp_word_buf = kj::ArrayPtr&lt;Word&gt;;</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>  <span class="keyword">using </span>flow::util::ceil_div;</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>  <span class="keyword">using </span>std::memset;</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>  <span class="keyword">constexpr</span> <span class="keywordtype">size_t</span> WORD_SZ = <span class="keyword">sizeof</span>(Word);</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span> </div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>  <span class="comment">/* Background from capnp: They&#39;re saying the need the allocated space for serialization to store at least min_sz:</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span><span class="comment">   * probably they&#39;re going to store some object that needs at least this much space.  So typically it&#39;s some</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span><span class="comment">   * scalar leaf thing, like 4 bytes or whatever; but it could be larger -- or even huge (e.g., a Data or List</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span><span class="comment">   * of huge size, because the user mutated it so via a ::Builder).  Oh, and it has to be zeroed, as by calloc().</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span><span class="comment">   *</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span><span class="comment">   * So all we *have* to allocate is min_sz exactly in that sense.  But the idea is to try to allocate more, so that</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span><span class="comment">   * capnp can efficiently shove more objects in there too without calling allocateSegment() for each one.</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span><span class="comment">   * And we&#39;re supposed to grow exponentially each time, so we keep track of the next size in m_segment_sz, same</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span><span class="comment">   * as capnp::MallocMessageBuilder internally does (check its source code).  Of course, if min_sz exceeds that,</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span><span class="comment">   * then we have no choice but to allocate the larger amount min_sz. */</span></div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span> </div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>  <span class="keyword">const</span> <span class="keywordtype">size_t</span> seg_sz</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>    = std::max(<span class="keywordtype">size_t</span>(min_sz), <span class="comment">// Don&#39;t forget: in their API min_sz is in `word`s.</span></div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>               <span class="comment">/* Seems prudent to give capnp an area that is a multiple of `word`s.  Maybe required.  Probably even.</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span><span class="comment">                * Exceeding it a little is okay. */</span></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>               <span class="keywordtype">size_t</span>(ceil_div(m_segment_sz, WORD_SZ)))</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>      * WORD_SZ;</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span> </div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;SHM builder [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: allocateSegment request for &gt;=[&quot;</span> &lt;&lt; min_sz &lt;&lt; <span class="stringliteral">&quot;] words; &quot;</span></div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>                 <span class="stringliteral">&quot;SHM-allocing ~max(that x sizeof(word), next-size=[&quot;</span> &lt;&lt; m_segment_sz &lt;&lt; <span class="stringliteral">&quot;]) = [&quot;</span> &lt;&lt; seg_sz &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>                 <span class="stringliteral">&quot;bytes.&quot;</span>);</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span> </div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>  uint8_t* buf_ptr;</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>  {</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>    <a class="code hl_class" href="classipc_1_1shm_1_1stl_1_1Arena__activator.html">Arena_activator</a> arena_ctx(m_arena);</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span> </div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>    <span class="comment">// Go to it!  This can throw (which as noted elsewhere is treated as a catastrophe a-la `new` bad_alloc for now).</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>    buf_ptr = &amp;(m_serialization_segments-&gt;emplace_back</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>                  (seg_sz,</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>                   <span class="comment">// (TRACE-log in this ctor if enabled.)  Must be removed if Segment_in_shm becomes non-Blob.</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>                   get_logger()).front());</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>  } <span class="comment">// Arena_activator arena_ctx(m_arena);</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span> </div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>  <span class="comment">/* capnp requires: it must be zeroed.  And Basic_blob ctor we used does *not* zero it.  So memset() it.</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">   * Caution!  If you choose to change-over to vector&lt;..., util::Default_init_allocator&lt;...&gt;&gt; instead, then</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">   * you&#39;ll need to add `std::memset(buf_ptr, 0, seg_sz)` here. */</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>  memset(buf_ptr, 0, seg_sz);</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span> </div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>  <span class="comment">// Since we are supposed to grow exponentially, increase this for next time (if any):</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>  m_segment_sz += seg_sz;</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>  <span class="comment">/* @todo MallocMessageBuilder does some bounding according to some maximum.  Probably we must do the same.</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="comment">   * Get back to this and follow capnp-interface reqs and/or follow what their internal logic does. */</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span> </div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;SHM builder [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Next-size grew exponentially to [&quot;</span> &lt;&lt; m_segment_sz &lt;&lt; <span class="stringliteral">&quot;] &quot;</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>                 <span class="stringliteral">&quot;for next time.&quot;</span>);</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span> </div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>  <span class="keywordflow">return</span> Capnp_word_buf(<span class="keyword">reinterpret_cast&lt;</span>Word*<span class="keyword">&gt;</span>(buf_ptr),</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>                        <span class="keyword">reinterpret_cast&lt;</span>Word*<span class="keyword">&gt;</span>(buf_ptr + seg_sz));</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>} <span class="comment">// Capnp_message_builder::allocateSegment()</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span> </div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Shm_arena&gt;</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac4969b49016844f884240b81ee1ab180">  423</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1transport_1_1struc_1_1shm.html#ac4969b49016844f884240b81ee1ab180">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html">Capnp_message_builder&lt;Shm_arena&gt;</a>&amp; val)</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>{</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>  <span class="keywordflow">return</span> os &lt;&lt; <span class="charliteral">&#39;@&#39;</span> &lt;&lt; &amp;val;</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>}</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span> </div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>} <span class="comment">// namespace ipc::transport::struc::shm</span></div>
<div class="ttc" id="aarena__activator_8hpp_html"><div class="ttname"><a href="arena__activator_8hpp.html">arena_activator.hpp</a></div></div>
<div class="ttc" id="aclassCapnp__msg__builder__interface_html"><div class="ttname"><a href="classCapnp__msg__builder__interface.html">Capnp_msg_builder_interface</a></div></div>
<div class="ttc" id="aclassipc_1_1shm_1_1stl_1_1Arena__activator_html"><div class="ttname"><a href="classipc_1_1shm_1_1stl_1_1Arena__activator.html">ipc::shm::stl::Arena_activator</a></div><div class="ttdoc">RAII-style class operating a stack-like notion of a the given thread's currently active SHM-aware Are...</div><div class="ttdef"><b>Definition:</b> <a href="arena__activator_8hpp_source.html#l00040">arena_activator.hpp:41</a></div></div>
<div class="ttc" id="aclassipc_1_1shm_1_1stl_1_1Stateless__allocator_html"><div class="ttname"><a href="classipc_1_1shm_1_1stl_1_1Stateless__allocator.html">ipc::shm::stl::Stateless_allocator</a></div><div class="ttdoc">Stateless allocator usable with STL-compliant containers to store (or merely read) them directly in S...</div><div class="ttdef"><b>Definition:</b> <a href="stateless__allocator_8hpp_source.html#l00118">stateless_allocator.hpp:119</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html">ipc::transport::struc::shm::Capnp_message_builder</a></div><div class="ttdoc">A capnp::MessageBuilder used by shm::Builder: similar to a MallocMessageBuilder with the GROW_HEURIST...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00066">capnp_msg_builder.hpp:69</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a0c3134a722b160fe2cf87461064db99b"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a0c3134a722b160fe2cf87461064db99b">ipc::transport::struc::shm::Capnp_message_builder::Capnp_message_builder</a></div><div class="ttdeci">Capnp_message_builder(flow::log::Logger *logger_ptr, Arena *arena)</div><div class="ttdoc">Constructs the message-builder, memorizing the SHM engine it shall use to construct/allocate data int...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00239">capnp_msg_builder.hpp:240</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a27d819a8373d2706f8c09341601a9cab"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a27d819a8373d2706f8c09341601a9cab">ipc::transport::struc::shm::Capnp_message_builder::allocateSegment</a></div><div class="ttdeci">kj::ArrayPtr&lt;::capnp::word &gt; allocateSegment(unsigned int min_sz) override</div><div class="ttdoc">Implements MessageBuilder API.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00364">capnp_msg_builder.hpp:364</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a3a21d479a863dd80df331b902c7fef16"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3a21d479a863dd80df331b902c7fef16">ipc::transport::struc::shm::Capnp_message_builder::~Capnp_message_builder</a></div><div class="ttdeci">~Capnp_message_builder()</div><div class="ttdoc">Decrements owner-process count by 1; if current count is 1 deallocates SHM-stored data.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00253">capnp_msg_builder.hpp:253</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a3c7909056d89e83d76ca4555193d3e48"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a3c7909056d89e83d76ca4555193d3e48">ipc::transport::struc::shm::Capnp_message_builder::Segment_in_shm_borrowed</a></div><div class="ttdeci">flow::util::Basic_blob&lt; Borrower_allocator&lt; uint8_t &gt; &gt; Segment_in_shm_borrowed</div><div class="ttdoc">For easier outside generic programming, this is the read-only-borrower counterpart to Segment_in_shm.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00122">capnp_msg_builder.hpp:122</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a49b5e0642b5c1be67c79e55484ecb7b6"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a49b5e0642b5c1be67c79e55484ecb7b6">ipc::transport::struc::shm::Capnp_message_builder::m_arena</a></div><div class="ttdeci">Arena * m_arena</div><div class="ttdoc">See ctor.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00218">capnp_msg_builder.hpp:218</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a4a613441302d5735d686adb7d6d92fb0"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a4a613441302d5735d686adb7d6d92fb0">ipc::transport::struc::shm::Capnp_message_builder::lend</a></div><div class="ttdeci">void lend(schema::detail::ShmTopSerialization::Builder *capnp_root, session::shm::Arena_to_shm_session_t&lt; Arena &gt; *shm_session)</div><div class="ttdoc">To be called after being done mutating underlying structured data, increments owner-process count by ...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00261">capnp_msg_builder.hpp:262</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a78c9e811a0cc8105fee37baf5f94929c"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a78c9e811a0cc8105fee37baf5f94929c">ipc::transport::struc::shm::Capnp_message_builder::Segment_in_shm</a></div><div class="ttdeci">flow::util::Basic_blob&lt; Allocator&lt; uint8_t &gt; &gt; Segment_in_shm</div><div class="ttdoc">The inner data structure stored in SHM representing one capnp-requested segment storing all or part o...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00116">capnp_msg_builder.hpp:116</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a7c04e91665590eb6b80d3ae1931765e8"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a7c04e91665590eb6b80d3ae1931765e8">ipc::transport::struc::shm::Capnp_message_builder::Segments_in_shm_borrowed</a></div><div class="ttdeci">bipc::list&lt; Segment_in_shm_borrowed, Borrower_allocator&lt; Segment_in_shm_borrowed &gt; &gt; Segments_in_shm_borrowed</div><div class="ttdoc">For easier outside generic programming, this is the read-only-borrower counterpart to Segments_in_shm...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00144">capnp_msg_builder.hpp:144</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a89d5dac6078a1a2c184e2239810b5480"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a89d5dac6078a1a2c184e2239810b5480">ipc::transport::struc::shm::Capnp_message_builder::m_segment_sz</a></div><div class="ttdeci">size_t m_segment_sz</div><div class="ttdoc">Minimum size of the next segment allocated by allocateSegment.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00228">capnp_msg_builder.hpp:228</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_a98472f1e376123f6d98297f5c61ebc76"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#a98472f1e376123f6d98297f5c61ebc76">ipc::transport::struc::shm::Capnp_message_builder::m_serialization_segments</a></div><div class="ttdeci">Arena::template Handle&lt; Segments_in_shm &gt; m_serialization_segments</div><div class="ttdoc">Outer SHM handle to the data structured in SHM that stores the capnp-requested serialization segments...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00231">capnp_msg_builder.hpp:231</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_ac2e22abe941240ffa765bff7d288ce1e"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ac2e22abe941240ffa765bff7d288ce1e">ipc::transport::struc::shm::Capnp_message_builder::Segments_in_shm</a></div><div class="ttdeci">bipc::list&lt; Segment_in_shm, Allocator&lt; Segment_in_shm &gt; &gt; Segments_in_shm</div><div class="ttdoc">The outer data structured stored in SHM representing the entire list of capnp-requested segments Segm...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00136">capnp_msg_builder.hpp:136</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder_html_ad96e79475a2bccc0c7186da577b61a38"><div class="ttname"><a href="classipc_1_1transport_1_1struc_1_1shm_1_1Capnp__message__builder.html#ad96e79475a2bccc0c7186da577b61a38">ipc::transport::struc::shm::Capnp_message_builder::Arena</a></div><div class="ttdeci">Shm_arena Arena</div><div class="ttdoc">Short-hand for, you know.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00074">capnp_msg_builder.hpp:74</a></div></div>
<div class="ttc" id="anamespacecapnp_html"><div class="ttname"><a href="namespacecapnp.html">capnp</a></div><div class="ttdoc">Small group of miscellaneous utilities to ease work with capnp (Cap'n Proto), joining its capnp names...</div><div class="ttdef"><b>Definition:</b> <a href="heap__serializer_8cpp_source.html#l00187">heap_serializer.cpp:188</a></div></div>
<div class="ttc" id="anamespaceipc_1_1session_1_1shm_html_af2acc444cc9664e57df8143b66b78d70"><div class="ttname"><a href="namespaceipc_1_1session_1_1shm.html#af2acc444cc9664e57df8143b66b78d70">ipc::session::shm::Arena_to_shm_session_t</a></div><div class="ttdeci">typename Arena_to_shm_session&lt; Arena &gt;::Type Arena_to_shm_session_t</div><div class="ttdoc">Alias that, given an Arena type (with Arena::construct&lt;T&gt;() which allocates/constructs a T),...</div><div class="ttdef"><b>Definition:</b> <a href="session_2shm_2shm_8hpp_source.html#l00054">shm.hpp:54</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_abfde278018c84aa1542475e9a4089c29"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#abfde278018c84aa1542475e9a4089c29">ipc::transport::struc::shm::classic::Builder</a></div><div class="ttdeci">Builder&lt; ipc::shm::classic::Pool_arena &gt; Builder</div><div class="ttdoc">Convenience alias: transport::struc::shm::Builder that works with boost.ipc.shm pools from ipc::shm::...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic__fwd_8hpp_source.html#l00036">classic_fwd.hpp:36</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_html"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm.html">ipc::transport::struc::shm</a></div><div class="ttdoc">Segregates zero-copy/SHM implementations of concepts residing in parent namespace ipc::transport::str...</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00029">capnp_msg_builder.hpp:30</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_html_ab592ce6eddbe24c57dc71f34018fb042"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm.html#ab592ce6eddbe24c57dc71f34018fb042">ipc::transport::struc::shm::capnp_set_lent_shm_handle</a></div><div class="ttdeci">void capnp_set_lent_shm_handle(schema::ShmHandle::Builder *shm_handle_root, const flow::util::Blob_sans_log_context &amp;lend_result)</div><div class="ttdoc">Utility that saves the result of a Shm_session1::lend_object&lt;T&gt;(const shared_ptr&lt;T&gt;&amp;) result into the...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__shm_2src_2ipc_2transport_2struc_2shm_2util_8cpp_source.html#l00028">util.cpp:28</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_html_ac4969b49016844f884240b81ee1ab180"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm.html#ac4969b49016844f884240b81ee1ab180">ipc::transport::struc::shm::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Capnp_message_builder&lt; Shm_arena &gt; &amp;val)</div><div class="ttdoc">Prints string representation of the given Capnp_message_builder to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="capnp__msg__builder_8hpp_source.html#l00423">capnp_msg_builder.hpp:423</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae0be7edba7e30ffa3f8b742af621f2ab"><div class="ttname"><a href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">ipc::util::Blob_const</a></div><div class="ttdeci">boost::asio::const_buffer Blob_const</div><div class="ttdoc">Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00134">util_fwd.hpp:134</a></div></div>
<div class="ttc" id="anamespaceipc_html_a4ccdeed058222c635745a4dc830e99f7"><div class="ttname"><a href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">ipc::Log_component</a></div><div class="ttdeci">Log_component</div><div class="ttdoc">The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00322">common.hpp:323</a></div></div>
<div class="ttc" id="asession_2shm_2shm_8hpp_html"><div class="ttname"><a href="session_2shm_2shm_8hpp.html">shm.hpp</a></div></div>
<div class="ttc" id="ashm_2shm_8hpp_html"><div class="ttname"><a href="shm_2shm_8hpp.html">shm.hpp</a></div></div>
<div class="ttc" id="astateless__allocator_8hpp_html"><div class="ttname"><a href="stateless__allocator_8hpp.html">stateless_allocator.hpp</a></div></div>
<div class="ttc" id="astruc__fwd_8hpp_html"><div class="ttname"><a href="struc__fwd_8hpp.html">struc_fwd.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu May 2 2024 23:56:38 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
